package com.ychs.utils;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * 验证码
 * @author 旧人
 *
 */
public class VerifyCodeUtils {
	// 定义生成验证码的宽
	private static int width = 94;
	// 定义验证码的高
	private static int height = 25;

	// 定义图片上显示的验证码的文字个数
	private static int codeCount = 4;
	// 定义图片文字的大小
	private static int fontHeight = 20;
	// 图片中文字生成的坐标
	private static int codeX = 20;

	private static int codeY = 20;
	// 定义验证码包含的字符
	private static char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G', 'K', 'L', 'M', 'N', 'O',
			'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };

	// 验证码方法生成
	public static Map<String, Object> getCode() {
		// 定义图片对象
		BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
		// 获取图形小处理工具
		Graphics graphics = bufferedImage.getGraphics();

		// 开始填充图片
		graphics.setColor(Color.WHITE	);
		graphics.fillRect(0, 0, width, height);

		// 创建字体
		Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
		graphics.setFont(font);

		// 画边框
		graphics.setColor(Color.BLACK);
		graphics.fillRect(0, 0, width - 1, height - 1);

		/**
		 * 生成干扰线 让图片不容易被程序检测
		 */
		Random random = new Random();
		graphics.setColor(Color.BLACK);

		for (int i = 0; i < 20; i++) {
			// 干扰线出现的坐标
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			// 干扰线结束的坐标
			int x1 = random.nextInt(10);
			int y1 = random.nextInt(10);
			graphics.drawLine(x, y, x + x1, y + y1);
		}

		// 给图片绘制随机字符
		StringBuffer randomCode = new StringBuffer();
		int red = 0, green = 0, blue = 0;

		// 开始随机产生验证码
		for (int i = 0; i < codeCount; i++) {
			// 得到随机的字符
			String code = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
			// 给每一个随机验证码字符绘制随机颜色
			red = random.nextInt(255);
			green = random.nextInt(255);
			blue = random.nextInt(255);

			graphics.setColor(new Color(red, green, blue));
			graphics.drawString(code, (i + 1) * codeX, codeY);

			// 将每一个生成的字符连接在一起
			randomCode.append(code);
		}

		// 开始设置返回值
		Map<String, Object> codeInfo = new HashMap();
		codeInfo.put("code", randomCode.toString());
		codeInfo.put("image", bufferedImage);
		return codeInfo;

	}
}
